/*
 * dsmGestorPedidos.cpp
 *
 *  Created on: Dec 15, 2013
 *      Author: m
 */

#include "DSMComun.h"
#include "SharedMemory2.h"
#include "MessageQueue.h"
#include "Semaphore.h"
#include "ColaRemotaTransmisor.h"
#include "ColaRemotaReceptor.h"
#include "CPrinter.h"
#include "StringUtils.h"

using ipc::MessageQueue;
using ipc::CPrinter;
using ipc::SharedMemory2;
using ipc::Semaphore;

int main ( int argc, char* argv[] )
{
    std::string nombreColaRemotaPedidos;
    std::string dsmIdString;
    int dsmId;
    int *contadorPedidos;

    CPrinter::setHeader( "dsmGestorPedidos" );

    if ( argc != 2 )
    {
        CPrinter::printErr( "Cantidad de argumentos invalidos" );
        exit( 1 );
    }
    // parseo el nombre de la cola de pedidos del argumento de entrada
    dsmIdString = argv[1];
    dsmId = StringUtils::StringToNumber<int>( dsmIdString );

    CPrinter::setHeader( "dsmGestorPedidos", dsmId );

    CPrinter::printOut( "INICIADO" );

    nombreColaRemotaPedidos = COLA_PEDIDO_BROKER_BASENAME + dsmIdString;

    ColaRemotaReceptor receptor( nombreColaRemotaPedidos );

    Semaphore mutexContadorPedidos =
            Semaphore::get( DSM_IPC_BASEFILE, MTX_CONT_PEDIDOS );
    contadorPedidos =
            SharedMemory2<int>::get( DSM_IPC_BASEFILE, SHM_CONT_PEDIDOS );
    MessageQueue<PedidoDSM> colaPedidoToken =
            MessageQueue<PedidoDSM>::get( DSM_IPC_BASEFILE, COLA_PEDIDO_TOKEN );


    while ( true )
    {
        PedidoDSM pedido;

        // espero pedidos de la cola remota
        pedido = receptor.recibirMensaje<PedidoDSM>();
        CPrinter::printOut( "Recibi un pedido con origen: %s", pedido.colaRespuesta );

        // incremento el contador de pedidos
        mutexContadorPedidos.p( dsmId - 1 );
        contadorPedidos[dsmId - 1 ] += 1;
        CPrinter::printOut( "Pedidos pendientes: %d", contadorPedidos[dsmId - 1 ] );
        mutexContadorPedidos.v( dsmId - 1 );

        // envio el pedido al gestor de entregas
        colaPedidoToken.put( pedido.idDSM, pedido );
    }

    return 0;
}
